#include <stdio.h>
#include <stdlib.h>

// typedef struct LNode *List;

typedef struct LNode
{
    int data;
    struct LNode * next;
}LNODE, *PNODE;

PNODE create();
void reverse(PNODE pHead);
int getLength(PNODE pHead);
PNODE findByIndex(int k, PNODE p);
PNODE findByValue(int x, PNODE p);
int add(int val, PNODE p);
int delete(int val, PNODE p);
void show_list(PNODE pHead);

int main()
{
    //此处需要先声明，否则会报error: unknown type name 'PNODE'
    PNODE pHead = create();
    //printf("here\n");
    int length = getLength(pHead);
    printf("length = %d\n", length);
    show_list(pHead);
    
    PNODE pp = findByIndex(3, pHead);
    printf("第2个位置的数为%d\n", pp->data);
    return 0;
}

PNODE create(){
    //只有申请顺序存储的数组时才能*num;
    PNODE pHead = (PNODE)malloc(sizeof(LNODE));//获得头指针
    if(pHead == NULL){
        printf("内存分配失败,程序终止");
        exit(-1);
    }
    //pHead要用来返回，不能修改其值，故新声明一个指针用来遍历
    PNODE p = pHead;
    //将新节点作为尾节点(尾插法)
    p->next = NULL;

    int len;
    int val;
    printf("请输入链表长度:");
    scanf("%d", &len);

    for(int i=0;i<len;i++){
        printf("请输入第%d元素:", i+1);
        scanf("%d", &val);

        PNODE pNew = (PNODE)malloc(sizeof(PNODE));
        if(pNew == NULL){
            printf("申请内存失败");
            exit(-1);
        }
        //给申请的节点赋值
        pNew->data = val;
        //将p指向新节点（将新节点挂在p后）
        p->next = pNew;
        //将新节点作为尾节点（尾节点指向NULL）
        pNew->next = NULL;
        //?
        p = pNew;
    }

    return pHead;
}

int getLength(PNODE pHead){
    PNODE p;
    p= pHead;
    int length = 0;
    while(p->next){
        length++;
        p = p->next;        
    }
    return length;
}

void show_list(PNODE pHead){
    printf("show:");
    PNODE p = pHead;
    while(p->next){
        printf("%d ",p->next->data);
        p = p->next;
    }
}

PNODE findByIndex(int k, PNODE pHead){
    PNODE p = pHead;
    int i = 1;
    while(p!=NULL && i<k){
        p = p->next;
        i++;
    }
    if(i==k){
        return p;
    }else{
        return NULL;
    }
}

// PNODE findByValue(int k, PNODE p){

// }

// int add(int val, PNODE p){

// }

// int delete(int val, PNODE p){

// }